Renderer类
Renderer::Render()
纯虚函数。在不同的子类中实现。
Renderers 更新 调用层次结构
=> Application::TickTimer()
=> Application::UpdateSceneIfNeed()
=> Application::UpdateScene()
=> RenderManager::UpdateAllRenderers()
=> Renderer::UpdateAllRenderersInternal()
=> for(;;) renderer->Renderer::UpdateRenderer()
=> if(shouldBeInScene)
=> if(!isInScene) GetScene().AddRenderer(this)
=> UpdateSceneHandle()
=> else
=> 从场景移除
Renderer::UpdateRenderer()
源码:
if (ShouldBeInScene ())
{
if (!IsInScene())
{
m_SceneHandle = GetScene().AddRenderer (this);
}
Assert (m_SceneHandle != kInvalidSceneHandle);
UpdateSceneHandle ();
}
else
{
// This should not be necessary but fixes a weird bug where a mesh is
// being leaked when disabled before loading a scene. Happens in the fps tutorial.
RemoveFromScene ();
}
以MeshRenderer为例
MeshRenderer::Render(int subsetindex, const ChannelAssigns& channels)//subsetIndex是子网格的index
DrawUtil::DrawMeshRaw (channels, *mesh, subsetIndex);
VBO* vbo = mesh.GetSharedVBO (channels.GetSourceMap());//共享VBO??
DrawUtil::DrawVBOMeshRaw (*vbo, mesh, channels, subsetIndex);
SubMesh& submesh = mesh.GetSubMeshFast(subsetIndex);//子网格
vbo.DrawVBO (channels, submesh.firstByte, submesh.indexCount, submesh.topology, firstVertex, vertexCount);//纯虚函数
=>派生D3D9VBO.DrawVBO
=>派生D3D11VBO.DrawVBO
=>派生GLESVBO.DrawVBO
GLESVBO.DrawInternal
//...
GLES_CHK(glDrawElements(gltopo, indexCount, GL_UNSIGNED_SHORT, indices));
//...
(END)